import argparse
import sys
from pathlib import Path
from typing import Optional

# 导入之前编写的模块
from gps_extractor import batch_extract_gps
from utm_converter import batch_convert_directory
from cluster_photos import run_clustering


def process_drone_photos(
        input_dir: Path,
        output_dir: Optional[Path] = None,
        distance: float = 10.0,
        skip_extraction: bool = False,
        skip_conversion: bool = False
):
    """
    处理无人机照片的主函数

    参数:
        input_dir: 包含无人机照片的目录
        output_dir: 输出目录（可选，默认为input_dir同级的processed_photos目录）
        distance: 聚类距离（米）
        skip_extraction: 是否跳过GPS提取步骤
        skip_conversion: 是否跳过坐标转换步骤
    """
    # 设置默认输出目录
    if output_dir is None:
        output_dir = input_dir.parent / "processed_photos"

    # 确保输出目录存在
    output_dir.mkdir(parents=True, exist_ok=True)

    print(f"输入目录: {input_dir}")
    print(f"输出目录: {output_dir}")
    print(f"聚类距离: {distance}米")
    print("-" * 50)

    # 步骤1: 提取GPS数据（如果不需要跳过）
    if not skip_extraction:
        print("步骤1: 从照片中提取GPS数据...")
        try:
            batch_extract_gps(input_dir, "csv")
            print("✓ GPS数据提取完成")
        except Exception as e:
            print(f"✗ GPS数据提取失败: {e}")
            return False
    else:
        print("步骤1: 跳过GPS数据提取")

    # 步骤2: 转换坐标到UTM6（如果不需要跳过）
    if not skip_conversion:
        print("步骤2: 转换坐标到UTM6坐标系...")
        try:
            batch_convert_directory(input_dir, "csv")
            print("✓ 坐标转换完成")
        except Exception as e:
            print(f"✗ 坐标转换失败: {e}")
            return False
    else:
        print("步骤2: 跳过坐标转换")

    # 步骤3: 聚类照片
    print("步骤3: 根据位置聚类照片...")
    try:
        run_clustering(input_dir, output_dir, distance)
        print("✓ 照片聚类完成")
    except Exception as e:
        print(f"✗ 照片聚类失败: {e}")
        return False

    print("-" * 50)
    print("所有处理步骤已完成！")
    print(f"请查看输出目录: {output_dir}")
    return True


def main():
    """主函数（命令行接口）"""
    parser = argparse.ArgumentParser(description='无人机图片聚类处理工具')
    parser.add_argument('--input', type=str, required=True,
                        help='输入目录，包含所有无人机照片')
    parser.add_argument('--output', type=str,
                        help='输出目录（可选，默认为输入目录同级的processed_photos目录）')
    parser.add_argument('--distance', type=float, default=10.0,
                        help='聚类距离（米）')
    parser.add_argument('--skip-extraction', action='store_true',
                        help='跳过GPS提取步骤（如果已有GPS数据文件）')
    parser.add_argument('--skip-conversion', action='store_true',
                        help='跳过坐标转换步骤（如果已有UTM坐标文件）')

    args = parser.parse_args()

    input_dir = Path(args.input)
    output_dir = Path(args.output) if args.output else None

    if not input_dir.exists():
        print(f"错误: 输入目录不存在: {input_dir}")
        sys.exit(1)

    success = process_drone_photos(
        input_dir=input_dir,
        output_dir=output_dir,
        distance=args.distance,
        skip_extraction=args.skip_extraction,
        skip_conversion=args.skip_conversion
    )

    if not success:
        sys.exit(1)


if __name__ == "__main__":


    # 直接设置参数值
    photo_dir = Path(r"C:\Users\11818\Desktop\康平备份\DCIM\100MEDIA")  # 替换为您的照片目录
    output_dir = Path(r"C:\Users\11818\Desktop\康平备份\DCIM\100MEDIA_output")  # 替换为您想要的输出目录
    distance = 10.0

    # 如果您已经提取了GPS数据，可以设置skip_extraction=True
    # 如果您已经转换了坐标，可以设置skip_conversion=True
    process_drone_photos(
        input_dir=photo_dir,
        output_dir=output_dir,
        distance=distance,
        skip_extraction=False,  # 如果已有GPS数据，设置为True
        skip_conversion=False  # 如果已有UTM坐标，设置为True
    )

